/* Copyright 2001,2002,2003 NAH6 BV
 * All Rights Reserved
 *
 *  $Header: /var/lib/cvs/secphone/ui/rng/fortuna/fnaAccumulator.h,v 1.3 2003/11/21 12:39:24 itsme Exp $
 *
 *
 */


#ifndef __FNAACCUMULATOR_H__

#include "vectorutils.h"
#include "fnaPool.h"
#include "fnaGenerator.h"
#include "winMutex.h"

//--------------------------------------------------------------------------
//
// the Accumulator is also referred to as the 'PRNG' in practical cryptography
//
// todo: add flag that signals if we are seeded properly
class Accumulator {
public:
    typedef int sourcenumber_t;
    typedef int poolnumber_t;

    Accumulator();
    ~Accumulator();

    void Initialize();

    bool AddRandomEvent(sourcenumber_t source, poolnumber_t pool, const ByteVector& data);
    bool RandomData(int nBytesRequested, ByteVector& r);

    bool UpdateSeedFile();
    void DoReseed();
    bool WriteSeedFile();

    enum { NROFSOURCES= 256 };
    enum { NROFPOOLS= 32 };
    enum { MINIMUMPOOLSIZE= 64 };           // in bytes
    enum { MINIMUMRESEEDINTERVAL= 100 };    // in msec
    enum { SEEDFILESIZE= 64 };              // in bytes

private:
    Pool m_pools[NROFPOOLS];

    Mutex m_mutexUpdateSeed;

    Generator m_generator;
    DWORD m_reseedtime;
    DWORD m_reseedcount;
    bool m_properly_seeded;

    void AddSystemTimeToRandom(ByteVector& random);

};


#define __FNAACCUMULATOR_H__
#endif
